Dependency Injection (DI)

Microsoft Technologies - এএসপি ডট নেট কোর (ASP.Net Core)
260
260

Dependency Injection (DI) হলো একটি ডিজাইন প্যাটার্ন যা ডিপেনডেন্সিগুলো (যেমন ক্লাস, সার্ভিস, বা অবজেক্ট) অন্য ক্লাসে ইনজেক্ট করার একটি কার্যকর পদ্ধতি। এটি ASP.NET Core-এর একটি বিল্ট-ইন ফিচার এবং অ্যাপ্লিকেশনের কোডকে আরও মডুলার, টেস্টেবল এবং মেইনটেনযোগ্য করে তোলে।

ASP.NET Core-এ DI ব্যবহার করা হয় সার্ভিস রেজিস্ট্রেশন এবং রিজলিউশন পরিচালনা করতে, যা অ্যাপ্লিকেশনের বিভিন্ন কম্পোনেন্টের মধ্যে ডিপেনডেন্সিগুলো সহজে যোগসূত্র স্থাপন করে।


Dependency Injection-এর প্রধান ধারণা

DI মূলত তিনটি গুরুত্বপূর্ণ ধারণার উপর ভিত্তি করে কাজ করে:

Dependency

Dependency হলো একটি ক্লাসের এমন কোনো অবজেক্ট বা সার্ভিস, যা সেই ক্লাসে ব্যবহৃত হয়।

Injection

Injection হলো সেই প্রক্রিয়া, যেখানে ডিপেনডেন্সি সরাসরি কোনো ক্লাসের মধ্যে তৈরি না করে বাইরের একটি উৎস থেকে সরবরাহ করা হয়।

Inversion of Control (IoC)

IoC মানে ক্লাস নিজে ডিপেনডেন্সি তৈরি না করে এটি কোনো বহিরাগত উৎস থেকে সরবরাহ পায়।


ASP.NET Core-এ Dependency Injection কিভাবে কাজ করে

ASP.NET Core-এ DI কাজ করার জন্য একটি IoC Container বা Service Container ব্যবহার করা হয়। এই কন্টেইনার তিনটি ধাপে কাজ করে:

  • Service Registration: ডিপেনডেন্সি কনটেইনারে সার্ভিস বা অবজেক্ট রেজিস্টার করা হয়।
  • Service Resolution: রেজিস্টার করা সার্ভিস প্রয়োজন হলে এটি রিজলভ করা হয়।
  • Lifetime Management: সার্ভিস বা অবজেক্ট কতক্ষণ পর্যন্ত কার্যকর থাকবে তা নির্ধারণ করা হয়।

DI-র লাইফটাইম

ASP.NET Core-এ DI তিন ধরনের লাইফটাইম সমর্থন করে:

Singleton

একটি সার্ভিস অ্যাপ্লিকেশন লাইফটাইম জুড়ে একবারই তৈরি হয় এবং সবার জন্য একই থাকে।

Scoped

একটি সার্ভিস প্রতিটি HTTP রিকোয়েস্টের জন্য একবার তৈরি হয়।

Transient

একটি সার্ভিস প্রতিবার ডিপেনডেন্সি রিকোয়েস্টের সময় নতুনভাবে তৈরি হয়।


ASP.NET Core-এ Dependency Injection ইমপ্লিমেন্ট করা

Service Registration

ASP.NET Core-এ ডিপেনডেন্সি কনটেইনারে সার্ভিস রেজিস্টার করার জন্য Startup.cs ফাইলের ConfigureServices মেথড ব্যবহার করা হয়।

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>();
    services.AddScoped<IOtherService, OtherService>();
    services.AddTransient<IAnotherService, AnotherService>();
}

Service Resolution

Service Resolution সাধারণত কনস্ট্রাক্টর ইনজেকশন ব্যবহার করে করা হয়।

public class HomeController : Controller
{
    private readonly IMyService _myService;

    public HomeController(IMyService myService)
    {
        _myService = myService;
    }

    public IActionResult Index()
    {
        var data = _myService.GetData();
        return View(data);
    }
}

Custom Service তৈরি করা

// Interface
public interface IMyService
{
    string GetData();
}

// Implementation
public class MyService : IMyService
{
    public string GetData()
    {
        return "Hello from MyService!";
    }
}

ASP.NET Core-এ বিল্ট-ইন সার্ভিস DI

ASP.NET Core অনেক বিল্ট-ইন সার্ভিস সরবরাহ করে, যা DI ব্যবহার করে রেজিস্টার করা যায়। উদাহরণ:

  • ILogger<T>: লগিং ব্যবস্থাপনার জন্য।
  • IConfiguration: অ্যাপ্লিকেশন কনফিগারেশন পরিচালনার জন্য।
  • IHttpClientFactory: HTTP ক্লায়েন্ট তৈরি এবং পরিচালনার জন্য।
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddHttpClient();
    services.AddLogging();
}

DI-র সুবিধা

  • কোডের মডুলারিটি বৃদ্ধি পায়: কোডের বিভিন্ন অংশ আলাদা করা সহজ হয়।
  • কোড টেস্ট করা সহজ হয়: DI ব্যবহার করে Unit Testing করা সহজ।
  • ডিপেনডেন্সি ম্যানেজমেন্ট স্বয়ংক্রিয় হয়: সার্ভিস বা অবজেক্টের লাইফটাইম ম্যানেজ করা সহজ হয়।

সারাংশ

Dependency Injection (DI) ASP.NET Core-এর একটি শক্তিশালী ফিচার, যা অ্যাপ্লিকেশনকে মডুলার, টেস্টেবল এবং সহজে পরিচালনাযোগ্য করে তোলে। DI ব্যবহার করে আপনি সার্ভিসের ডিপেনডেন্সি সহজে হ্যান্ডেল করতে পারবেন এবং অ্যাপ্লিকেশনের গুণগত মান বাড়াতে পারবেন।

common.content_added_by

Dependency Injection এর মৌলিক ধারণা

232
232

Dependency Injection (DI) হলো একটি ডিজাইন প্যাটার্ন, যা অ্যাপ্লিকেশনের বিভিন্ন ক্লাস এবং অবজেক্টের মধ্যে ডিপেনডেন্সিগুলো পরিচালনা করতে ব্যবহৃত হয়। এটি একটি ক্লাসের নির্ভরশীলতা (Dependency) সরাসরি সেই ক্লাসের মধ্যে তৈরি না করে বাইরে থেকে সরবরাহ করার পদ্ধতি। DI এর মাধ্যমে কোড আরও মডুলার, পুনর্ব্যবহারযোগ্য এবং টেস্টযোগ্য হয়।


Dependency Injection এর মূল ধারণাগুলো

Dependency কী?

Dependency হলো একটি ক্লাসের এমন কোনো অবজেক্ট বা সার্ভিস, যা সেই ক্লাসের কার্য সম্পাদনে প্রয়োজন হয়। উদাহরণস্বরূপ, একটি ক্লাস যদি ডেটা রিটার্ন করার জন্য অন্য একটি ক্লাসের ওপর নির্ভরশীল হয়, তবে সেই ক্লাসটি তার Dependency

public class DataProcessor
{
    private DatabaseService _dbService;

    public DataProcessor()
    {
        _dbService = new DatabaseService(); // Dependency
    }
}

উপরের কোডে DataProcessor ক্লাস সরাসরি DatabaseService তৈরি করছে, যা সরাসরি ডিপেনডেন্সি তৈরি করার উদাহরণ।

Injection কী?

Injection হলো ডিপেনডেন্সি সরাসরি ক্লাসের মধ্যে তৈরি না করে, এটি বাইরে থেকে সরবরাহ করার প্রক্রিয়া।

public class DataProcessor
{
    private readonly DatabaseService _dbService;

    public DataProcessor(DatabaseService dbService) // Dependency Injected
    {
        _dbService = dbService;
    }
}

উপরের উদাহরণে, DatabaseService অবজেক্টটি কনস্ট্রাক্টরের মাধ্যমে সরবরাহ করা হয়েছে। এটি DI এর একটি উদাহরণ।

Inversion of Control (IoC)

DI মূলত Inversion of Control (IoC) এর বাস্তবায়ন। IoC মানে ক্লাস নিজে তার নির্ভরশীলতা নিয়ন্ত্রণ না করে তা বাইরে থেকে সরবরাহ করা হয়। IoC Container বা Service Container এই দায়িত্ব পালন করে।


Dependency Injection এর প্রকারভেদ

Constructor Injection

Dependency সরবরাহ করার জন্য কনস্ট্রাক্টর ব্যবহার করা হয়। এটি সবচেয়ে সাধারণ এবং জনপ্রিয় পদ্ধতি।

public class DataProcessor
{
    private readonly IDataService _dataService;

    public DataProcessor(IDataService dataService)
    {
        _dataService = dataService;
    }
}

Property Injection

Dependency সরবরাহ করার জন্য একটি Public Property ব্যবহার করা হয়।

public class DataProcessor
{
    public IDataService DataService { get; set; }
}

Method Injection

Dependency সরবরাহ করার জন্য একটি মেথড ব্যবহার করা হয়।

public class DataProcessor
{
    public void ProcessData(IDataService dataService)
    {
        dataService.GetData();
    }
}

DI ব্যবহারের প্রয়োজনীয়তা

  • Coupling হ্রাস করা: DI কোডের Tight Coupling কমায়, যা কোডের মডুলারিটি বাড়ায়।
  • Unit Testing সহজ করা: DI ব্যবহার করলে Mock Objects ব্যবহার করে সহজে টেস্ট করা যায়।
  • Reusable এবং Maintainable কোড: DI ব্যবহার করলে কোড পুনর্ব্যবহারযোগ্য এবং সহজে রক্ষণাবেক্ষণযোগ্য হয়।

DI এর উদাহরণ

সরাসরি Dependency ব্যবহার (Poor Design)

public class DataProcessor
{
    private DatabaseService _dbService = new DatabaseService();

    public void ProcessData()
    {
        _dbService.SaveData();
    }
}

এখানে DataProcessor সরাসরি DatabaseService তৈরি করছে, যা Tightly Coupled ডিজাইন।

Dependency Injection ব্যবহার (Good Design)

public class DataProcessor
{
    private readonly IDatabaseService _dbService;

    public DataProcessor(IDatabaseService dbService)
    {
        _dbService = dbService;
    }

    public void ProcessData()
    {
        _dbService.SaveData();
    }
}

এখানে IDatabaseService ইন্টারফেস ব্যবহার করে Dependency Inject করা হয়েছে, যা Loosely Coupled ডিজাইন।


DI ব্যবহারের সুবিধা

  • Modular Design: বিভিন্ন কম্পোনেন্ট আলাদাভাবে ব্যবস্থাপনা করা যায়।
  • Testability: DI ব্যবহার করে কোড সহজেই টেস্ট করা যায়।
  • Maintainability: Dependency পরিবর্তন করা সহজ হয়।
  • Reusability: DI এর মাধ্যমে একবার তৈরি করা সার্ভিস বা অবজেক্ট অন্যত্র সহজেই ব্যবহার করা যায়।

Dependency Injection একটি শক্তিশালী ডিজাইন প্যাটার্ন, যা ASP.NET Core এর কোডিং স্ট্যান্ডার্ড এবং আর্কিটেকচারে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি অ্যাপ্লিকেশনকে মডুলার, স্কেলেবল এবং টেস্টযোগ্য করে তোলে।

common.content_added_by

ASP.NET Core-এ Dependency Injection ইমপ্লিমেন্ট করা

261
261

ASP.NET Core-এ Dependency Injection (DI) একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা কোডের পুনঃব্যবহারযোগ্যতা, পরীক্ষাযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করে। DI হল একটি ডিজাইন প্যাটার্ন যেখানে ক্লাসগুলোর মধ্যে ডিপেনডেন্সি বা নির্ভরতাগুলি বাইরের উৎস থেকে ইনজেক্ট করা হয়, যা একে খুবই নমনীয় এবং কার্যকরী করে তোলে।

ASP.NET Core-এ Dependency Injection প্রাথমিকভাবে বিল্ট-ইন সমর্থন সহ আসে, এবং এটি খুব সহজেই কনফিগার করা যায়।


Dependency Injection এর ধারণা

Dependency Injection হচ্ছে একটি প্যাটার্ন যার মাধ্যমে ক্লাসের মধ্যে নির্ভরতাগুলি সরাসরি তৈরি না করে বাহ্যিকভাবে (অথবা ইনজেকশনের মাধ্যমে) ইনজেক্ট করা হয়। এর মাধ্যমে কোডের মডুলারিটি বাড়ানো হয় এবং কোডের বিভিন্ন অংশের মধ্যে কম্প্লেক্সিটির স্তর কমানো হয়।

DI এর প্রধান উপকারিতা:

  • টেস্টযোগ্যতা: নির্ভরতাগুলি ইনজেক্ট করার মাধ্যমে ক্লাসগুলোকে সহজে মক করা যায়, ফলে ইউনিট টেস্টিং সহজ হয়।
  • লুজ কপ্লিং: কোডের মধ্যে দৃঢ় সম্পর্ক (tight coupling) কমিয়ে, কোডের মডুলারিটি বৃদ্ধি পায়।
  • কোডের পুনঃব্যবহারযোগ্যতা: নির্ভরশীল কোড বা কম্পোনেন্টগুলিকে পৃথকভাবে ব্যবহার করা যায়।

ASP.NET Core-এ Dependency Injection কনফিগারেশন

ASP.NET Core-এ DI কনফিগার করা অত্যন্ত সহজ এবং এটি Startup.cs বা Program.cs ফাইলে ইনজেকশন কনফিগার করা হয়।

1. Service Interface এবং Implementation তৈরি করা

প্রথমে একটি ইন্টারফেস এবং সেই ইন্টারফেসের জন্য একটি ইমপ্লিমেন্টেশন তৈরি করতে হবে। উদাহরণস্বরূপ:

// Service Interface
public interface IMessageService
{
    string GetMessage();
}

// Service Implementation
public class MessageService : IMessageService
{
    public string GetMessage()
    {
        return "Hello from Dependency Injection!";
    }
}

2. Service Registration

DI কনফিগার করতে, আপনাকে ConfigureServices মেথডে সেবাটি রেজিস্টার করতে হবে। এটি সাধারণত Startup.cs বা Program.cs ফাইলে করা হয়।

Program.cs ফাইলে DI কনফিগারেশন:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddSingleton<IMessageService, MessageService>();
                // অন্যান্য সেবাগুলিও এখানে রেজিস্টার করুন
            });
}

এখানে, AddSingleton<IMessageService, MessageService>() সেবাটিকে Singleton লাইফটাইম হিসেবে রেজিস্টার করছে। এটি মানে একবার সেবা তৈরি হলে তা পুরো অ্যাপ্লিকেশনজুড়ে একটাই ইনস্ট্যান্স ব্যবহৃত হবে।

আপনি আরও কয়েকটি লাইফটাইম অপশন ব্যবহার করতে পারেন:

  • AddScoped: এই সেবাটি HTTP রিকোয়েস্টের জন্য একটি নতুন ইনস্ট্যান্স তৈরি করবে।
  • AddTransient: প্রতি ডিপেনডেন্সি রেজিস্ট্রেশনের জন্য একটি নতুন ইনস্ট্যান্স তৈরি করবে।

3. সেবা ইনজেক্ট করা

এখন, যেখানে আপনি সেবা প্রয়োজন, সেখানে সেই সেবাটি ইনজেক্ট করতে হবে। উদাহরণস্বরূপ, একটি কন্ট্রোলার ক্লাসে এই সেবাটি ইনজেক্ট করা:

public class HomeController : Controller
{
    private readonly IMessageService _messageService;

    // Constructor Dependency Injection
    public HomeController(IMessageService messageService)
    {
        _messageService = messageService;
    }

    public IActionResult Index()
    {
        ViewData["Message"] = _messageService.GetMessage();
        return View();
    }
}

এখানে, IMessageService কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়েছে। ASP.NET Core স্বয়ংক্রিয়ভাবে MessageService ইনস্ট্যান্সটি প্রদান করবে, যেহেতু এটি DI কনটেইনারে রেজিস্টার করা হয়েছে।

4. DI সেবা ব্যবহার করা

আপনার অ্যাপ্লিকেশনে HomeController যেমন যেকোনো ক্লাসে DI সেবা ব্যবহার করতে পারেন। ASP.NET Core তার নিজস্ব DI কনটেইনার ব্যবহার করে এই সেবাগুলো ইনজেক্ট করে দেয়।


Scoped, Transient এবং Singleton লাইফটাইম

DI সেবাগুলো বিভিন্ন লাইফটাইমে রেজিস্টার করা যেতে পারে। প্রতিটি লাইফটাইমের বিশেষ উদ্দেশ্য রয়েছে:

  • Singleton: এই লাইফটাইমে রেজিস্টার করা সেবা অ্যাপ্লিকেশনের শুরু থেকে শেষ পর্যন্ত একটি ইনস্ট্যান্স হিসেবে কাজ করে। এটি কম্পনেন্টের মধ্যে শেয়ারড ডেটা বা অবস্থান ধারণ করতে পারে।

    services.AddSingleton<IMessageService, MessageService>();
    
  • Scoped: এই সেবাটি একটি নির্দিষ্ট স্কোপে কাজ করে, সাধারণত HTTP রিকোয়েস্টের সাথে সম্পর্কিত। একটি HTTP রিকোয়েস্টের জন্য একটি ইনস্ট্যান্স তৈরি হবে এবং এটি সেই রিকোয়েস্টের মধ্যে সীমাবদ্ধ থাকবে।

    services.AddScoped<IMessageService, MessageService>();
    
  • Transient: এই সেবাটি প্রতি ডিপেনডেন্সি রেজিস্ট্রেশন বা ইনজেকশন এ একটি নতুন ইনস্ট্যান্স তৈরি করবে।

    services.AddTransient<IMessageService, MessageService>();
    

সারাংশ

ASP.NET Core-এ Dependency Injection (DI) ব্যবহার করে অ্যাপ্লিকেশনের কোডের পুনঃব্যবহারযোগ্যতা, টেস্টযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করা সম্ভব। DI কনফিগারেশন খুবই সহজ এবং এটি স্বয়ংক্রিয়ভাবে সেবাগুলো ইনজেক্ট করে দেয়, যা কোডের কার্যকারিতা এবং নমনীয়তা বাড়ায়। DI-র মাধ্যমে ASP.NET Core আরও শক্তিশালী এবং মডুলার অ্যাপ্লিকেশন তৈরি করতে সহায়তা করে।

common.content_added_by

Scoped, Transient, এবং Singleton লাইফটাইম

241
241

ASP.NET Core-এ Dependency Injection (DI) একটি গুরুত্বপূর্ণ কনসেপ্ট, যা অ্যাপ্লিকেশনের ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করে এবং কোডের পুনরায় ব্যবহারযোগ্যতা বাড়ায়। DI এর মাধ্যমে, আপনি বিভিন্ন সার্ভিস ক্লাসকে একসাথে সংযুক্ত করতে পারেন, যেগুলোর লাইফটাইম ম্যানেজ করা যায়। ASP.NET Core-এ তিনটি প্রধান সার্ভিস লাইফটাইম রয়েছে: Scoped, Transient, এবং Singleton। এগুলোর ব্যবহার অ্যাপ্লিকেশনের কাঠামো এবং পারফরম্যান্সের ওপর প্রভাব ফেলে।


Scoped লাইফটাইম

Scoped লাইফটাইমে একটি সার্ভিস প্রতিটি HTTP রিকোয়েস্ট এর জন্য একবার তৈরি হয় এবং সেই রিকোয়েস্ট চলাকালীন সার্ভিসটি পুনরায় ব্যবহার করা হয়। এই লাইফটাইমটি সাধারণত ডেটাবেস সংযোগ বা অন্য কোনো রিকোয়েস্ট-বেসড সার্ভিসের জন্য ব্যবহার করা হয়।

ব্যবহার

Scoped সার্ভিস শুধুমাত্র একটি নির্দিষ্ট রিকোয়েস্টের মধ্যে জীবিত থাকে এবং যখন রিকোয়েস্ট শেষ হয়ে যায়, তখন এটি ধ্বংস হয়ে যায়। এটি সাধারণত Controller বা Middleware-এর মতো রিকোয়েস্ট ভিত্তিক সার্ভিসে ব্যবহৃত হয়।

উদাহরণ:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IMyService, MyService>();
}

এখানে, IMyService ইন্টারফেসের একটি ইন্সট্যান্স প্রতিটি HTTP রিকোয়েস্টের জন্য নতুনভাবে তৈরি হবে এবং রিকোয়েস্টের জন্য ব্যবহৃত হবে।


Transient লাইফটাইম

Transient লাইফটাইমে একটি সার্ভিস প্রতিটি Dependency Injection কলের জন্য নতুনভাবে তৈরি হয়। প্রতিবার একটি নতুন ইন্সট্যান্স তৈরি হবে, এবং এটি যতবারই ডিপেনডেন্সি ইনজেক্ট করা হোক না কেন, প্রতিবারই এটি নতুন হবে।

ব্যবহার

Transient সার্ভিসটি সাধারণত ছোট, স্বতন্ত্র এবং পরিবর্তনযোগ্য ডেটা বা কর্মক্ষমতা পরিচালনা করে, যেমন লগিং সার্ভিস, ক্লায়েন্ট-কনফিগার করা সার্ভিস ইত্যাদি।

উদাহরণ:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IMyService, MyService>();
}

এখানে, IMyService প্রতিবার সার্ভিস প্রয়োজন হলে, একেবারে নতুন একটি ইন্সট্যান্স তৈরি হবে। এটি সাধারণত সেই সার্ভিসে ব্যবহার হয়, যেগুলো একটি রিকোয়েস্টের মধ্যে একাধিকবার ব্যবহৃত হতে পারে।


Singleton লাইফটাইম

Singleton লাইফটাইমে একটি সার্ভিস অ্যাপ্লিকেশন শুরু হওয়ার পর থেকে অ্যাপ্লিকেশন চলাকালীন পুরো সময় জুড়ে একবার তৈরি হয় এবং একটি একই ইন্সট্যান্স সকল জায়গায় ব্যবহৃত হয়। এটি সাধারণত সেই সার্ভিসে ব্যবহৃত হয় যেগুলো ডেটা শেয়ার করতে হয় বা দীর্ঘমেয়াদী সংযোগ রাখতে হয়।

ব্যবহার

Singleton সার্ভিসটি দীর্ঘস্থায়ী অবস্থায় থাকে এবং অ্যাপ্লিকেশন চলাকালীন একমাত্র ইন্সট্যান্স ব্যবহৃত হয়, যেমন কনফিগারেশন সার্ভিস, লগিং সার্ভিস বা এমন কোনো সার্ভিস যেটি খুব কম সময়ে বা কখনও নতুনভাবে তৈরি করা প্রয়োজন হয় না।

উদাহরণ:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>();
}

এখানে, IMyService কেবল একবার তৈরি হবে এবং অ্যাপ্লিকেশন চলাকালীন পুরো সময় একক ইন্সট্যান্সের মাধ্যমে ব্যবহৃত হবে।


লাইফটাইমের তুলনা

লাইফটাইমসার্ভিসের অবস্থাএক্সটেনশনউপযুক্ত পরিস্থিতি
Scopedরিকোয়েস্ট-ভিত্তিকএক রিকোয়েস্টের মধ্যে একবার তৈরি হয়রিকোয়েস্ট ভিত্তিক ডেটা যেমন ডাটাবেস কানেকশন, ইউজার সেশন
Transientএকবার ব্যবহার হওয়াপ্রতিবার নতুনভাবে তৈরি হয়ছোট, অস্থায়ী সার্ভিস যেমন ডেটা প্রসেসিং, ইউটিলিটি সার্ভিস
Singletonঅ্যাপ্লিকেশন চলাকালীন একটিইঅ্যাপ্লিকেশন চলাকালীন একটাই ইন্সট্যান্সকনফিগারেশন, লগিং, এবং এমন সার্ভিস যা একাধিক জায়গায় শেয়ার করা হয়

কবে কোন লাইফটাইম ব্যবহার করবেন?

  • Scoped: যখন সার্ভিসটি রিকোয়েস্ট ভিত্তিক এবং তার পরে রিসোর্স মুক্তি প্রয়োজন।
  • Transient: যখন সার্ভিসটি দ্রুত এবং স্বতন্ত্রভাবে কাজ করবে এবং এর ইন্সট্যান্স বারবার তৈরি করার কোনও সমস্যা নেই।
  • Singleton: যখন সার্ভিসটি অ্যাপ্লিকেশন চলাকালীন একক অবস্থায় থাকবে এবং দীর্ঘমেয়াদী সংযোগ বা শেয়ারড ডেটা ব্যবস্থাপনা করবে।

সারসংক্ষেপ

ASP.NET Core এর Dependency Injection লাইফটাইম গুলি - Scoped, Transient, এবং Singleton - প্রতিটির নিজস্ব ব্যবহারের ক্ষেত্র রয়েছে। একটি সঠিক লাইফটাইম নির্বাচন করা আপনার অ্যাপ্লিকেশনের পারফরম্যান্স এবং কোডের সুসংগঠনকে শক্তিশালী করতে সহায়ক।

common.content_added_by

DI এর সাথে Custom Service তৈরি করা

320
320

ASP.NET Core-এ Dependency Injection (DI) একটি বিল্ট-ইন ফিচার, যা কোডের রিইউজেবিলিটি এবং টেস্টেবিলিটি নিশ্চিত করতে সাহায্য করে। Custom Service তৈরি এবং DI এর মাধ্যমে তা ব্যবহার করা ASP.NET Core অ্যাপ্লিকেশনে সাধারণ একটি প্রক্রিয়া। এখানে ধাপে ধাপে Custom Service তৈরি এবং তা DI এর মাধ্যমে ব্যবহার করার পদ্ধতি ব্যাখ্যা করা হলো।


Custom Service তৈরি করা

Custom Service হলো এমন একটি ক্লাস, যা নির্দিষ্ট একটি ফিচার বা কার্য সম্পাদনের জন্য ডিজাইন করা হয়।

Custom Service Interface তৈরি

প্রথমে একটি ইন্টারফেস তৈরি করুন, যা Service এর ফাংশনালিটিগুলো ডিফাইন করবে।

public interface ICustomService
{
    string GetMessage();
}

Custom Service Implementation

এরপর ইন্টারফেসটি ইমপ্লিমেন্ট করে একটি ক্লাস তৈরি করুন, যেখানে সুনির্দিষ্ট ফাংশনালিটি প্রদান করা হবে।

public class CustomService : ICustomService
{
    public string GetMessage()
    {
        return "Hello from Custom Service!";
    }
}

Custom Service-কে DI Container-এ রেজিস্টার করা

ASP.NET Core-এ Startup.cs ফাইলের ConfigureServices মেথডে Custom Service রেজিস্টার করতে হবে।

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    
    // Custom Service রেজিস্ট্রেশন
    services.AddTransient<ICustomService, CustomService>();
}

লাইফটাইম নির্বাচন

  • Transient: প্রতি রিকোয়েস্টে নতুন ইনস্ট্যান্স তৈরি হয়।

    services.AddTransient<ICustomService, CustomService>();
    
  • Scoped: প্রতি রিকোয়েস্টে একটি ইনস্ট্যান্স তৈরি হয় এবং এটি রিকোয়েস্ট শেষ হওয়া পর্যন্ত থাকে।

    services.AddScoped<ICustomService, CustomService>();
    
  • Singleton: পুরো অ্যাপ্লিকেশন জুড়ে একটি মাত্র ইনস্ট্যান্স ব্যবহার হয়।

    services.AddSingleton<ICustomService, CustomService>();
    

Custom Service ব্যবহার করা

Constructor Injection ব্যবহার

Custom Service-কে একটি Controller-এ ব্যবহার করতে চাইলে Constructor Injection ব্যবহার করতে হবে।

public class HomeController : Controller
{
    private readonly ICustomService _customService;

    public HomeController(ICustomService customService)
    {
        _customService = customService;
    }

    public IActionResult Index()
    {
        var message = _customService.GetMessage();
        ViewData["Message"] = message;
        return View();
    }
}

Custom Service থেকে ডেটা ভিউতে পাঠানো

Controller থেকে ডেটা ভিউতে পাঠানো হয়েছে। এখন এই ডেটা ভিউতে প্রদর্শিত হবে।

<h1>@ViewData["Message"]</h1>

Custom Service টেস্ট করা

Unit Test এর জন্য Mocking

Custom Service এর ফাংশনালিটি টেস্ট করার জন্য Mocking Framework ব্যবহার করা যেতে পারে, যেমন Moq।

[Fact]
public void Test_CustomService()
{
    var mockService = new Mock<ICustomService>();
    mockService.Setup(service => service.GetMessage()).Returns("Test Message");

    var controller = new HomeController(mockService.Object);
    var result = controller.Index() as ViewResult;

    Assert.Equal("Test Message", result.ViewData["Message"]);
}

সারাংশ

Custom Service তৈরি এবং DI এর মাধ্যমে তা ব্যবহার করা ASP.NET Core অ্যাপ্লিকেশনে কোড মেইনটেনেন্স এবং স্কেলেবিলিটির জন্য অত্যন্ত কার্যকর। Custom Service-কে DI Container-এ রেজিস্টার করার পর এটি সহজেই অ্যাপ্লিকেশনের যেকোনো স্থানে ইনজেক্ট করা যায়। এটি অ্যাপ্লিকেশনের মডুলার আর্কিটেকচার নিশ্চিত করে এবং টেস্টেবিলিটি বাড়ায়।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion